package cn.tedu.simulateioc;/**
 * @Author 金帮嘉诚 @Date 2021-07-16 星期五 17:10
 */
/*本类用于测试 模拟IoC底层创建对象的过程*/

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 知识点
 * 1.将  id名  和  类的全路径名  存储   在数据结构中 因为需要查询操作 所以选用ArrayList
 * 2.为了实现按照id名查找到对象，使用键值对存储 即map结构 <String,Object> 存储 id值  和  类的对象
 *
 * 所以：
 * 两个数据结构
 * list 存储 bean对象  包含 id 和 类的全路径名
 * map  存储 id值 和 类对象
 */
public class MyIoC {
    private List<Bean> beanFactory = new ArrayList<>();

    //list 存一些bean
    public MyIoC() throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        Bean bean1 = new Bean("hello", "cn.tedu.simulateioc.Hello");
        Bean bean2 = new Bean("user", "cn.tedu.simulateioc.User");
        Bean bean3 = new Bean("sun", "cn.tedu.simulateioc.Sun");

        beanFactory.add(bean1);
        beanFactory.add(bean2);
        beanFactory.add(bean3);
        init();
    }

    private final Map<String, Object> factoryBeanObject = new ConcurrentHashMap<>();

    //map 存对象 松耦合
    public void init() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        //map若写在方法里无法被获取
        for (Bean b : beanFactory
        ) {
            String key = b.getBeanName();
            String path = b.getBeanPath();
            Object value = Class.forName(path).newInstance();
            factoryBeanObject.put(key, value);
        }
    }

    public Object getBean(String beanName) {
        return factoryBeanObject.get(beanName);
    }
}
